package com.aseo.model.entity;

import java. io.Serializable;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

@Entity(name = "com.aseo.model.entity.Reclamo")
@Table(name = "reclamo")
public class Reclamo implements Serializable {

	private static final long serialVersionUID = 358323994906055414L;
	
	@SequenceGenerator(name = "reclamo_id_reclamo_seq", sequenceName = "reclamo_id_reclamo_seq")
    @GeneratedValue(generator = "reclamo_id_reclamo_seq")
    @Id
    @Basic(optional = false)
    @Column(name = "id_reclamo")
    private Long idReclamo;
    
	@Column(name = "codigo")
    private String codigo;
    
	@Column(name = "fecha_hora")
    private Timestamp fechaHora;

    @NotEmpty(message = "Debe especificar el nombre del reclamador") 
    @Column(name = "reclamador_nombre")
    private String reclamadorNombre;
    
    @Pattern(regexp="[0-9|-]+", message="Codigo del sprimer telefono invalido")
    @Column(name = "reclamador_primer_telefono_prefijo")
    private String reclamadorPrimerTelefonoPrefijo;
    
    @NotEmpty(message = "Debe especificar la cedula del reclamador")
    @Pattern(regexp="[v|V|e|E][-][0-9]+", message="Ingrese una cedula valida, V- o E- seguido de numeros")
    @Column(name = "reclamador_cedula")
    private String reclamadorCedula;
    
    @Pattern(regexp="[0-9|-]+", message="Codigo del segundo telefono invalido")
    @Column(name = "reclamador_segundo_telefono_prefijo")
    private String reclamadorSegundoTelefonoPrefijo;
    
    @Pattern(regexp="[0-9|-]+", message="Formato del primer telefono invalido")
    @Column(name = "reclamador_primer_telefono")
    private String reclamadorPrimerTelefono;
    
    @Pattern(regexp="[0-9|-]+", message="Formato del segundo telefono invalido")
    @Column(name = "reclamador_segundo_telefono")
    private String reclamadorSegundoTelefono;
    
    @NotEmpty(message = "Debe especificar un email")   
    @Email (message="No es un formato de email reconocible")
    @Column(name = "email")
    private String email;

    @NotNull (message="Debe especificar la parroquia a la que pertenece el reclamo")
    @JoinColumn(name = "id_parroquia", referencedColumnName = "id_parroquia")
    @ManyToOne
    private Parroquia idParroquia;

    @NotNull (message="Debe especificar el sector al que pertenece el reclamo")
    @JoinColumn(name = "id_sector", referencedColumnName = "id_sector")
    @ManyToOne
    private Sector idSector;

    @NotEmpty(message = "Debe especificar las observaciones") 
    @Column(name = "observaciones")
    private String observaciones;

    @Column(name = "receptor_reclamo")
    private String receptorReclamo;
 
    @OneToMany(mappedBy = "idReclamo")
    private List<ReclamoEstado> reclamoEstadoCollection;
   
    @JoinColumn(name = "id_catalogo_reclamo_estado", referencedColumnName = "id_catalogo_reclamo_estado")
    @ManyToOne
    private CatalogoReclamoEstado idCatalogoReclamoEstado;

    @OneToMany( fetch = FetchType.EAGER, mappedBy = "idReclamo")
    private Set<Supervision> supervisionCollection;
 
    @OneToMany(mappedBy = "idReclamo")
    private List<ReclamoMedia> reclamoMediaCollection;

    @OneToMany(mappedBy = "idPadre", cascade = CascadeType.ALL, fetch = FetchType.EAGER )
    private Set<Reclamo> reclamoCollection;
    
    @JoinColumn(name = "id_padre", referencedColumnName = "id_reclamo")
    @ManyToOne
    private Reclamo idPadre;
    
    @JoinColumn(name = "id_tipo_via_uno", referencedColumnName = "id_tipo_via")
    @ManyToOne
    private TipoVia idTipoViaUno;

    @JoinColumn(name = "id_tipo_via_dos", referencedColumnName = "id_tipo_via")
    @ManyToOne
    private TipoVia idTipoViaDos;
    
    @JoinColumn(name = "id_tipo_via_tres", referencedColumnName = "id_tipo_via")
    @ManyToOne
    private TipoVia idTipoViaTres;
    
    @Column(name = "descripcion_tipo_via_uno")
    private String descripcionTipoViaUno;
    
    @Column(name = "descripcion_tipo_via_dos")
    private String descripcionTipoViaDos;
    
    @Column(name = "descripcion_tipo_via_tres")
    private String descripcionTipoViaTres;
    
    @JoinColumn(name = "id_tipo_relacion_via", referencedColumnName = "id_tipo_relacion_via")
    @ManyToOne
    private TipoRelacionVia idTipoRelacionVia;
    
    @Column(name = "referencia_via")
    private String referenciaVia;
 
    @JoinColumn(name = "id_punto_recoleccion", referencedColumnName = "id_punto_recoleccion")
    @ManyToOne
    private PuntoRecoleccion idPuntoRecoleccion;
    
    @OneToMany( fetch = FetchType.EAGER, mappedBy = "idReclamo")
    private Set<AccionReclamo> accionReclamoCollection;
    
    @OneToOne ( mappedBy = "idReclamo", fetch = FetchType.EAGER )
    private CierreReclamo cierreReclamo;
    
    @OneToMany( fetch = FetchType.EAGER, mappedBy = "idReclamo")
    private Set<ReclamoNota> reclamoNotaCollection;
 
    public Reclamo() {
    }

    public Reclamo(Long idReclamo) {
        this.idReclamo = idReclamo;
    }

    public Long getIdReclamo() {
        return idReclamo;
    }

    public void setIdReclamo(Long idReclamo) {
        this.idReclamo = idReclamo;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Timestamp getFechaHora() {
        return fechaHora;
    }

    public void setFechaHora(Timestamp fechaHora) {
        this.fechaHora = fechaHora;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public String getReceptorReclamo() {
        return receptorReclamo;
    }

    public void setReceptorReclamo(String receptorReclamo) {
        this.receptorReclamo = receptorReclamo;
    }

    public String getReclamadorCedula() {
        return reclamadorCedula;
    }

    public void setReclamadorCedula(String reclamadorCedula) {
        this.reclamadorCedula = reclamadorCedula;
    }

    public String getReclamadorNombre() {
        return reclamadorNombre;
    }

    public void setReclamadorNombre(String reclamadorNombre) {
        this.reclamadorNombre = reclamadorNombre;
    }

    public String getReclamadorPrimerTelefono() {
        return reclamadorPrimerTelefono;
    }

    public void setReclamadorPrimerTelefono(String reclamadorPrimerTelefono) {
        this.reclamadorPrimerTelefono = reclamadorPrimerTelefono;
    }

    public String getReclamadorSegundoTelefono() {
        return reclamadorSegundoTelefono;
    }

    public void setReclamadorSegundoTelefono(String reclamadorSegundoTelefono) {
        this.reclamadorSegundoTelefono = reclamadorSegundoTelefono;
    }
    
    public String getEmail() {
		return email;
	}

    public void setEmail(String email) {
		this.email = email;
	}
    
    public List<ReclamoEstado> getReclamoEstadoCollection() {
        return reclamoEstadoCollection;
    }

    public void setReclamoEstadoCollection(List<ReclamoEstado> reclamoEstadoCollection) {
        this.reclamoEstadoCollection = reclamoEstadoCollection;
    }

    public CatalogoReclamoEstado getIdCatalogoReclamoEstado() {
        return idCatalogoReclamoEstado;
    }

    public void setIdCatalogoReclamoEstado(CatalogoReclamoEstado idCatalogoReclamoEstado) {
        this.idCatalogoReclamoEstado = idCatalogoReclamoEstado;
    }

    public Parroquia getIdParroquia() {
        return idParroquia;
    }

    public void setIdParroquia(Parroquia idParroquia) {
        this.idParroquia = idParroquia;
    }

    public Sector getIdSector() {
        return idSector;
    }

    public void setIdSector(Sector idSector) {
        this.idSector = idSector;
    }

    public Set<Supervision> getSupervisionCollection() {
        return supervisionCollection;
    }

    public void setSupervisionCollection(Set<Supervision> supervisionCollection) {
        this.supervisionCollection = supervisionCollection;
    }

    public List<ReclamoMedia> getReclamoMediaCollection() {
        return reclamoMediaCollection;
    }

    public void setReclamoMediaCollection(List<ReclamoMedia> reclamoMediaCollection) {
        this.reclamoMediaCollection = reclamoMediaCollection;
    }
    
    public Set<Reclamo> getReclamoCollection() {
        return reclamoCollection;
    }

    public void setReclamoCollection(Set<Reclamo> reclamoCollection) {
        this.reclamoCollection = reclamoCollection;
    }

    public Reclamo getIdPadre() {
        return idPadre;
    }

    public void setIdPadre(Reclamo idPadre) {
        this.idPadre = idPadre;
    }
    
    public String getReclamadorSegundoTelefonoPrefijo() {
		return reclamadorSegundoTelefonoPrefijo;
	}
    
    public void setReclamadorSegundoTelefonoPrefijo(
			String reclamadorSegundoTelefonoPrefijo) {
		this.reclamadorSegundoTelefonoPrefijo = reclamadorSegundoTelefonoPrefijo;
	}
    
    public String getReclamadorPrimerTelefonoPrefijo() {
		return reclamadorPrimerTelefonoPrefijo;
	}
    
    public void setReclamadorPrimerTelefonoPrefijo(
			String reclamadorPrimerTelefonoPrefijo) {
		this.reclamadorPrimerTelefonoPrefijo = reclamadorPrimerTelefonoPrefijo;
	}

    public String getDescripcionTipoViaDos() {
		return descripcionTipoViaDos;
	}
    
    public void setDescripcionTipoViaDos(String descripcionTipoViaDos) {
		this.descripcionTipoViaDos = descripcionTipoViaDos;
	}
    
    public String getDescripcionTipoViaTres() {
		return descripcionTipoViaTres;
	}
    
    public void setDescripcionTipoViaTres(String descripcionTipoViaTres) {
		this.descripcionTipoViaTres = descripcionTipoViaTres;
	}
    
    public String getDescripcionTipoViaUno() {
		return descripcionTipoViaUno;
	}
    
    public void setDescripcionTipoViaUno(String descripcionTipoViaUno) {
		this.descripcionTipoViaUno = descripcionTipoViaUno;
	}
    
    public TipoRelacionVia getIdTipoRelacionVia() {
		return idTipoRelacionVia;
	}
    
    public void setIdTipoRelacionVia(TipoRelacionVia idTipoRelacionVia) {
		this.idTipoRelacionVia = idTipoRelacionVia;
	}
    
    public TipoVia getIdTipoViaDos() {
		return idTipoViaDos;
	}
    
    public void setIdTipoViaDos(TipoVia idTipoViaDos) {
		this.idTipoViaDos = idTipoViaDos;
	}
    
    public TipoVia getIdTipoViaTres() {
		return idTipoViaTres;
	}
    
    public void setIdTipoViaTres(TipoVia idTipoViaTres) {
		this.idTipoViaTres = idTipoViaTres;
	}
    
    public TipoVia getIdTipoViaUno() {
		return idTipoViaUno;
	}
    
    public void setIdTipoViaUno(TipoVia idTipoViaUno) {
		this.idTipoViaUno = idTipoViaUno;
	}
    
    public String getReferenciaVia() {
		return referenciaVia;
	}
    
    public void setReferenciaVia(String referenciaVia) {
		this.referenciaVia = referenciaVia;
	}
    
    public Set<AccionReclamo> getAccionReclamoCollection() {
		return accionReclamoCollection;
	}
    
    public void setAccionReclamoCollection(Set<AccionReclamo> accionReclamoCollection) {
		this.accionReclamoCollection = accionReclamoCollection;
	}
    
    public CierreReclamo getCierreReclamo() {
		return cierreReclamo;
	}
    
    public void setCierreReclamo(CierreReclamo cierreReclamo) {
		this.cierreReclamo = cierreReclamo;
	}
    
    public Set<ReclamoNota> getReclamoNotaCollection() {
		return reclamoNotaCollection;
	}
    
    public void setReclamoNotaCollection(Set<ReclamoNota> reclamoNotaCollection) {
		this.reclamoNotaCollection = reclamoNotaCollection;
	}
    
    public PuntoRecoleccion getIdPuntoRecoleccion() {
		return idPuntoRecoleccion;
	}
    
    public void setIdPuntoRecoleccion(PuntoRecoleccion idPuntoRecoleccion) {
		this.idPuntoRecoleccion = idPuntoRecoleccion;
	}
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idReclamo != null ? idReclamo.hashCode() : 0);
        return hash;
    }    
    
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Reclamo)) {
            return false;
        }
        Reclamo other = (Reclamo) object;
        if ((this.idReclamo == null && other.idReclamo != null) || (this.idReclamo != null && !this.idReclamo.equals(other.idReclamo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.aseo.model.entity.Reclamo[idReclamo=" + idReclamo + "]";
    }

    @Transient
    public boolean getIsPadre() {
    	return idPadre != null;
    }
    
    @Transient
    public String getTextFecha() {
    	return fechaHora != null ? SimpleDateFormat.getDateInstance().format(fechaHora) : "";
    }
    
    @Transient
    public String getTextHora() {
    	return fechaHora != null ? SimpleDateFormat.getTimeInstance().format(fechaHora) : "";
    }
    
    @Transient
    public String getPrefixCodigo() {
    	return codigo != null ? codigo.substring(0, codigo.length() - 4) : "";
    }

    @Transient
    public String getSufixCodigo() {
    	return codigo != null ? codigo.substring(codigo.length() - 4) : "";
    }

}